from datetime import datetime

from django import http
from django.shortcuts import render

# Create your views here.
from django.views import View

from apps.contents.utils import get_categories
from apps.goods import models
from apps.goods.models import GoodsCategory,SKU, GoodsVisitCount
from apps.goods.utils import get_breadcrumb
from apps.orders.models import OrderGoods
from utils.response_code import RETCODE

class DetailVisitView(View):
    def post(self,request,category_id):
        try:
        #接收参数
        # 检验三级分类是否存在sku.category.id表示的是三级分类的id
            category = GoodsCategory.objects.get(id=category_id)
        except:
            return http.HttpResponseForbidden('该分类不存在!')
        #日期格式化   日期按照格式转化为字符串
        today_str = datetime.now().strftime("%Y-%m-%d")
        #将字符串转化为日期格式
        today_date = datetime.strptime(today_str, '%Y-%m-%d')
        #判断日期
        try:
            # 3.1分类存在 count+1
            # 3.2分类不存再 新建模型数据
            visit = GoodsCategory.objects.get(category =category,date = today_date)
        except:
            visit = GoodsVisitCount()
        visit.count +=1
        visit.category = category  #关联分类
        visit.save()
    #返回响应对象
        return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK'})

class ListView(View):
    def get(self,request,category_id,page_num):
        cat3 = GoodsCategory.objects.get(id=category_id)

        # *   1. 三级商品分类  调用 contents 封装好的代码
        #频道表里面的商品的级层分类信息
        categories = get_categories()

        # *   2. 面包屑组件 cat3.parent
        breadcrumb = get_breadcrumb(cat3)
        # * 3. 排序sort通过前端传进来 order_by
        #通过request请求得到sort的字段
        sort = request.GET.get('sort')

        # *    默认 价格  人气=== -create_time price -sales
        # order_field = ""
        if sort == "price":
            order_field = "price"
        elif sort == "hot":
            order_field = '-sales'
        else:  #其他的默认根据时间排序
            order_field = "create_time"
                #添加过滤条件   根据传入的分类id来过滤对应的商品   #是否下架
        skus = SKU.objects.filter(category=cat3, is_launched=True).order_by(order_field)
        # *    4. 分页器 paginator: 一页几个; 每页的内容skus; 总页数
        from django.core.paginator import Paginator
        paginator = Paginator(skus, 4) #实例化
        page_skus = paginator.page(page_num) #当前页数据
        total_pages = paginator.num_pages  #总页数
        #*      5.热销商品

        context = {
            'categories': categories,
            "breadcrumb": breadcrumb,
            'sort': sort,  # 排序字段
            'category': cat3,  # 第三级分类
            'page_skus': page_skus,  # 分页后数据
            'total_page': total_pages,  # 总页数
            'page_num': page_num,  # 当前页码
        }

        return render(request, 'list.html', context)

class HotView(View):
    def get(self, request, category_id):
        # 1.取所有skus              #根据类id过滤商品类
        hot_skus_obj = SKU.objects.filter(category_id=category_id, is_launched=True)

        # 2.截取 2个          【里面不能取负】
        hot_skus_obj = hot_skus_obj[0:2]

        # 前端使用的是 vue渲染 只认识 list dict 不认识python的对象
        hot_skus = []
        for sku in hot_skus_obj:
            hot_skus.append({

                'id': sku.id,
                'default_image_url': sku.default_image.url,
                'name': sku.name,
                'price': sku.price

            })

        return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'hot_skus': hot_skus})
#详细信息表
class DetailView(View):
    def get(self, request, sku_id):
        """提供商品详情页"""
        # 获取当前sku的信息
        try:
            sku = models.SKU.objects.get(id=sku_id)
        except models.SKU.DoesNotExist:
            return render(request, '404.html')

        # 查询商品频道分类
        categories = get_categories()
        #get_categories表示的是通过封装函数获得所有的频道信息(一级二级分类)
        # 查询面包屑导航
        breadcrumb = get_breadcrumb(sku.category)

        # 构建当前商品的规格键  获取当前显示商品的所有规格[屏幕尺寸,颜色,版本]
        sku_specs = sku.specs.order_by('spec_id')
        sku_key = []   ##记录商品的所有选项id值
        for spec in sku_specs:
            ##sku_key = [1,4,7] 当前商品的所有规格分别对应[屏幕,颜色,版本]
            sku_key.append(spec.option.id)
        # 获取当前商品的所有SKU
        skus = sku.spu.sku_set.all()
        # [<SKU: 1: Apple 13.3英寸笔记本 银色>, <SKU: 2: Apple 13.3英寸笔记本 深灰色>]
        # < QuerySet[ < SKU: 3: AppleiPhone8Plus(A1864)64GB金色移动联通电信4G手机 >,
        # < SKU: 4: AppleiPhone8Plus(A1864)256GB金色移动联通电AppleiPhone8Plus(A1864)64GB深空灰色移动联通电信4G手机 >,
        # < SKU: 6: AppleiPhone8Plus(A1864)256深空灰色移动联通电信4G手机 >,
        # < SKs(A1864)64GB银色移动联通电信4G手机 >,
        # < SKU: 8: AppleiPhone8Plus(A1864)256GB银移动联通电信4G手机 >] >

        # print("abc",skus) ######得到的spu里面所有sku的数据  比喻华为手机p10 苹果8  苹果笔记本
        # 构建不同规格参数（选项）的sku字典

        ###例子detail/9/：华为 HUAWEI P10 Plus 6GB+64GB 钻雕金 移动联通电信4G手机 双卡双待

        spec_sku_map = {}
        for s in skus:
            # 获取sku的规格参数
            s_specs = s.specs.order_by('spec_id')
            # 用于形成规格参数-sku字典的键
            key = []
            for spec in s_specs:
                key.append(spec.option.id)
            # 向规格参数-sku字典添加记录
            spec_sku_map[tuple(key)] = s.id
#{(16, 21): 16, (14, 21): 11, (16, 20): 15, (15, 20): 13, (14, 20): 12, (13, 20): 9, (15, 21): 14, (13, 21): 10}
        # print(spec_sku_map)
        # 获取当前商品的规格信息
        goods_specs = sku.spu.specs.order_by('id')
        #QuerySet [<SPUSpecification: 华为 HUAWEI P10 Plus: 颜色>,
        # <SPUSpecification: 华为 HUAWEI P10 Plus: 版本>]>
        # print('d',goods_specs)
        # 若当前sku的规格信息不完整，则不再继续
        if len(sku_key) < len(goods_specs):
            return
        # 给当前spu下面的每个规格绑定
        for index, spec in enumerate(goods_specs):
            # 复制当前sku的规格键
            key = sku_key[:]
            # 该规格的选项
            # print('b',key)  #[13, 20]
            spec_options = spec.options.all()
            for option in spec_options:
                # 在规格参数sku字典中查找符合当前规格的sku
                # 修改当前的选项组合,一次只改一种选项
                key[index] = option.id
                # 给每个选项对象绑定一个sku_id
                option.sku_id = spec_sku_map.get(tuple(key))
                # print('a',option.sku_id)  #9,12,13,15
                # 将当前规格的所有选项绑定到规格对象
            spec.spec_options = spec_options
            # print('c',spec.spec_options)
        #执行过程
        # b[13, 20]
        # a  9
        # a  12
        # a  13
        # a  15
        # c < QuerySet[ < SpecificationOption: 华为HUAWEIP10: 颜色 - 钻雕金 >,
        # < SpecificationOption: 华为HUAWEIP10Plus: 颜色 - 钻雕蓝 >,
        #  < Specif华为HUAWEIP10Plus: 颜色 - HUAWEIP10Plus: 颜色 - 曜石黑 >] >
        # b[13, 20]
        # a  9
        # a  10
        # c < QuerySet[ < SpecificationOption: 华为HUAWEIP10Plus: 版本 - 64GB >,
        # < SpecificationOption: 华为HUAWEIP10Plus: 版本 - 128GB >] >

        # 渲染页面
        context = {
            'categories': categories,
            'breadcrumb': breadcrumb,
            'sku': sku,
            'specs': goods_specs,
        }
        return render(request, 'detail.html', context)

#详情页展示评价信息
class CommentsView(View):
    def get(self,request,sku_id):
        #获取被评价的订单商品的信息
        order_lists = OrderGoods.objects.filter(sku_id=sku_id,is_commented=True).order_by('-create_time')[:30]
        comment_list = []
        for order_goods in order_lists:
            #order_goods评论的商品.order外键得到orderinfo类
            # orderinfo类里面的.user外键得到user类.username得到username的属性
            username = order_goods.order.user.username
            comment_list.append({
                'username':username[0]+'****'+username[-1] if order_goods.is_anonymous else username,
                'comment':order_goods.comment,
                'score':order_goods.score
            })
        return http.JsonResponse({'code':'0','errmsg':'OK','comment_list':comment_list})

